iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
AI/ ML & Data

基於人工智慧與深度學習對斑馬魚做行為分析系列 第 22

day 22 人工智慧自動餵魚系統

  • 分享至 

  • xImage
  •  

今天是第二十二天我們可以寫一個人工智慧系統實現自動養魚的系統,以下是程式碼

系統架構

  1. 魚缸監控系統

    • 使用多個攝像頭從不同角度監控魚缸。
    • 建立視頻流服務器來實時監控和存儲數據,支援即時分析和長期行為分析。
  2. 複雜行為檢測與分析

    • 使用 YOLOv8 或 YOLO-NAS 來檢測魚的具體行為,例如遊動速度、互動情況、是否靠近餵食器等。
    • 透過 LSTM、GRU 或 Transformer 模型來分析和預測魚的行為變化,並動態調整餵食策略。
  3. 環境感測

    • 增加水質感測器(如 pH 值、溶氧量、溫度等)來監控魚缸環境,這些數據將用於影響餵食決策。
    • 使用 Raspberry Pi 或 Arduino 來處理這些感測器數據,並與 AI 系統集成。
  4. 多模式餵食策略

    • 根據魚的種類、年齡和行為狀態,動態調整餵食的種類、時間和量。
    • 支援用戶手動調整或完全自動模式。
  5. 遠程監控與控制

    • 設計一個 Web 或手機應用程式,允許用戶遠程監控魚缸狀況,調整餵食策略,並接收即時警報和報告。

主要步驟與代碼

1. 攝像頭多視角視頻流監控

import cv2
import threading

def stream_camera(camera_id, window_name):
    cap = cv2.VideoCapture(camera_id)
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imshow(window_name, frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

camera_threads = []
for i in range(3):  # 假設有3個攝像頭
    t = threading.Thread(target=stream_camera, args=(i, f'Camera {i}'))
    t.start()
    camera_threads.append(t)

for t in camera_threads:
    t.join()

2. YOLO-NAS 進行複雜行為檢測

import cv2
from yolonas import YOLOv8

# 初始化 YOLO-NAS 模型
model = YOLOv8("yolonas_large.pt")

def analyze_fish_behavior(video_path):
    cap = cv2.VideoCapture(video_path)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        results = model.predict(frame)
        for result in results:
            x1, y1, x2, y2, confidence, class_id = result
            label = model.class_names[class_id]
            
            # 畫出檢測框與標籤
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        
        cv2.imshow('Fish Behavior', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

# 假設視頻文件來自實時流
analyze_fish_behavior("fish_tank_stream.mp4")

3. LSTM 模型結合環境感測進行餵食預測

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# 假設資料結構 [時間, 魚狀態, pH, 溫度, 溶氧量, 餵食量]
data = np.array([
    [1, 0.8, 7.5, 26, 8.0, 50],
    [2, 0.7, 7.6, 26.5, 8.1, 45],
    # 更多數據
])

# LSTM 模型設計
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(data.shape[1] - 1, 1)))
model.add(Dropout(0.2))
model.add(LSTM(64))
model.add(Dense(1, activation='linear'))

model.compile(optimizer='adam', loss='mse')

# 假設訓練數據
X = data[:, :-1].reshape((data.shape[0], data.shape[1] - 1, 1))
y = data[:, -1]

# 模擬訓練
model.fit(X, y, epochs=200, batch_size=32)

# 預測下一次的餵食量
future_environment = np.array([[3, 0.75, 7.7, 27, 8.2]]).reshape((1, 5, 1))
predicted_feeding = model.predict(future_environment)
print(f"預測餵食量: {predicted_feeding[0][0]}")

4. 使用 Raspberry Pi 控制餵食裝置並整合感測器數據

import RPi.GPIO as GPIO
import time
import Adafruit_DHT  # 假設使用 DHT22 感測器

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

# 假設使用 DHT22 來獲取環境溫濕度
def read_environment():
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)
    return humidity, temperature

def feed_fish(amount):
    for _ in range(amount):
        GPIO.output(18, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(18, GPIO.LOW)
        time.sleep(0.5)

# 獲取環境數據並餵食
humidity, temperature = read_environment()
print(f"環境溫度: {temperature}, 濕度: {humidity}")

predicted_feeding_amount = int(predicted_feeding[0][0])
feed_fish(predicted_feeding_amount)

5. 遠程監控與控制

你可以使用 Flask 或 Django 框架來建立一個 Web 應用,讓用戶可以通過瀏覽器或手機應用控制和監控餵魚系統。

from flask import Flask, render_template, request
import threading

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/feed', methods=['POST'])
def feed():
    amount = int(request.form['amount'])
    threading.Thread(target=feed_fish, args=(amount,)).start()
    return f"正在餵食 {amount} 次。"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

系統架構概述

  1. 魚缸監控系統

    • 使用多個攝像頭來實時監控魚缸,並透過視頻流服務器進行數據儲存和即時分析。
  2. 複雜行為檢測與分析

    • 利用 YOLOv8 或 YOLO-NAS 模型來檢測魚的行為,並根據這些檢測結果進行行為分析。
  3. 環境感測

    • 使用感測器來監控水質(如 pH 值、溫度、溶氧量等),並將這些數據整合到餵食決策中。
  4. 多模式餵食策略

    • 根據魚的行為和環境數據,自動或手動調整餵食量和方式。
  5. 遠程監控與控制

    • 建立一個 Web 應用,讓用戶可以遠程監控和控制餵魚系統。

主要步驟與代碼解析

1. 攝像頭多視角視頻流監控

這部分代碼負責從多個攝像頭獲取視頻流並顯示。以下是詳細的代碼解釋:

import cv2
import threading

def stream_camera(camera_id, window_name):
    cap = cv2.VideoCapture(camera_id)
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imshow(window_name, frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

camera_threads = []
for i in range(3):  # 假設有3個攝像頭
    t = threading.Thread(target=stream_camera, args=(i, f'Camera {i}'))
    t.start()
    camera_threads.append(t)

for t in camera_threads:
    t.join()
  • cv2.VideoCapture(camera_id):初始化攝像頭。
  • cap.read():讀取攝像頭捕獲的畫面。
  • cv2.imshow(window_name, frame):顯示畫面。
  • 使用 threading.Thread 來並行處理多個攝像頭視頻流。

2. YOLO-NAS 進行複雜行為檢測

這部分代碼負責使用 YOLO 模型進行魚的行為檢測:

import cv2
from yolonas import YOLOv8

# 初始化 YOLO-NAS 模型
model = YOLOv8("yolonas_large.pt")

def analyze_fish_behavior(video_path):
    cap = cv2.VideoCapture(video_path)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        results = model.predict(frame)
        for result in results:
            x1, y1, x2, y2, confidence, class_id = result
            label = model.class_names[class_id]
            
            # 畫出檢測框與標籤
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        
        cv2.imshow('Fish Behavior', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

# 假設視頻文件來自實時流
analyze_fish_behavior("fish_tank_stream.mp4")
  • YOLOv8("yolonas_large.pt"):載入預訓練的 YOLO-NAS 模型。
  • model.predict(frame):對每一幀進行物體檢測,返回檢測結果。
  • 在畫面上畫出檢測框和標籤。

3. LSTM 模型結合環境感測進行餵食預測

這部分代碼使用 LSTM 模型來預測未來的餵食量:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# 假設資料結構 [時間, 魚狀態, pH, 溫度, 溶氧量, 餵食量]
data = np.array([
    [1, 0.8, 7.5, 26, 8.0, 50],
    [2, 0.7, 7.6, 26.5, 8.1, 45],
    # 更多數據
])

# LSTM 模型設計
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(data.shape[1] - 1, 1)))
model.add(Dropout(0.2))
model.add(LSTM(64))
model.add(Dense(1, activation='linear'))

model.compile(optimizer='adam', loss='mse')

# 假設訓練數據
X = data[:, :-1].reshape((data.shape[0], data.shape[1] - 1, 1))
y = data[:, -1]

# 模擬訓練
model.fit(X, y, epochs=200, batch_size=32)

# 預測下一次的餵食量
future_environment = np.array([[3, 0.75, 7.7, 27, 8.2]]).reshape((1, 5, 1))
predicted_feeding = model.predict(future_environment)
print(f"預測餵食量: {predicted_feeding[0][0]}")
  • Sequential():建立 LSTM 模型。
  • model.add(LSTM(...)):添加 LSTM 層來處理序列數據。
  • model.fit(X, y):訓練模型。
  • model.predict(future_environment):使用模型進行未來餵食量預測。

4. 使用 Raspberry Pi 控制餵食裝置並整合感測器數據

這部分代碼控制餵食裝置,並讀取環境感測器數據:

import RPi.GPIO as GPIO
import time
import Adafruit_DHT  # 假設使用 DHT22 感測器

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

# 假設使用 DHT22 來獲取環境溫濕度
def read_environment():
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)
    return humidity, temperature

def feed_fish(amount):
    for _ in range(amount):
        GPIO.output(18, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(18, GPIO.LOW)
        time.sleep(0.5)

# 獲取環境數據並餵食
humidity, temperature = read_environment()
print(f"環境溫度: {temperature}, 濕度: {humidity}")

predicted_feeding_amount = int(predicted_feeding[0][0])
feed_fish(predicted_feeding_amount)
  • GPIO.setup(18, GPIO.OUT):設置 GPIO 腳位來控制餵食裝置。
  • Adafruit_DHT.read_retry(...):讀取溫濕度數據。
  • feed_fish(amount):根據預測餵食量來控制餵食裝置。

5. 遠程監控與控制

這部分代碼設置了基本的 Flask Web 應用來遠程控制餵食:

from flask import Flask, render_template, request
import threading

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/feed', methods=['POST'])
def feed():
    amount = int(request.form['amount'])
    threading.Thread(target=feed_fish, args=(amount,)).start()
    return f"正在餵食 {amount} 次。"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • Flask(__name__):初始化 Flask 應用。
  • @app.route('/'):根路由,渲染首頁模板。
  • @app.route('/feed', methods=['POST']):處理餵食請求。

結論

這個系統的設計涵蓋了從視頻監控、行為檢測、環境感測、餵食預測到遠程控制的全面功能。每個模塊都可以根據實際需要進行調整和擴展。


上一篇
day 21 人工智慧斑馬魚運動軌跡分析
下一篇
day 23人工智慧斑馬魚藥物分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言